﻿/*
 * Разработчик: Коледа Андрей
 * Дата: 20.01.2011
 * Время: 11:17
 * Email: koleda.andrey@gmail.com
 */
using System;
using System.Collections.Generic;
using System.Linq;
using FastTravel.DataAccess.Base;

namespace FastTravel.DataAccess.Interface
{
	/// <summary>
	/// Интерфейс репозитория
	/// </summary>
	/// <typeparam name="T">Сущность</typeparam>
	public interface IRepository<T> where T : class
	{
		IQueryable<T> GetQuery();

		/// <summary>
		/// Получить все сущности
		/// </summary>
		/// <returns>Перечень сущностей</returns>
		IEnumerable<T> GetAll();

		/// <summary>
		/// Получить страницу
		/// </summary>
		/// <param name="start">Начальный индекс</param>
		/// <param name="limit">Размер страницы</param>
		/// <param name="sort">Сортировка по полю</param>
		/// <param name="dir">Направление сортировки</param>
		/// <param name="count">Количество объектов</param>
		/// <returns>Список</returns>
		List<T> GetPage(int start, int limit, string sort, string dir, out int count);

		/// <summary>
		/// Сортировка
		/// </summary>
		/// <typeparam name="T">Объект</typeparam>
		/// <param name="q">Запрос</param>
		/// <param name="sort">Сортировать по полю</param>
		/// <param name="ascending">Направление сортировки</param>
		/// <returns>Перечень сущностей</returns>
		IQueryable<T> SortByQuery<T>(IQueryable<T> q, string sort, bool ascending);

		/// <summary>
		/// Найти сущность по параметрам
		/// </summary>
		/// <param name="where">Параметр</param>
		/// <returns>Сущность</returns>
		IEnumerable<T> Find(Func<T, bool> where);

		/// <summary>
		/// Получить единственную сущность по параметрам
		/// </summary>
		/// <param name="where">Парметр</param>
		/// <returns>Сущность</returns>
		T Single(Func<T, bool> where);

		/// <summary>
		/// Получить первую попавшуюся сущность по параметрам
		/// </summary>
		/// <param name="where">Параметр</param>
		/// <returns>Сущность</returns>
		T First(Func<T, bool> where);

		/// <summary>
		/// Удалить сущность
		/// </summary>
		/// <param name="entity">Сущность</param>
		void Delete(T entity);

		/// <summary>
		/// Добавить сущность
		/// </summary>
		/// <param name="entity">Сущность</param>
		void Add(T entity);

		/// <summary>
		/// Добавить сущность к контексту
		/// </summary>
		/// <param name="entity">Сущность</param>
		void Attach(T entity);

		/// <summary>
		/// Сохранить изменения
		/// </summary>
		void SaveChanges();
	}

}
